这个频道内会详细介绍异步编程与同步编程的不同之处以及需要注意的事项。
- 不要在代码中执行
sleep
以及其他睡眠函数,这样会导致整个进程阻塞 exit/die
是危险的,会导致Worker
进程退出- 可通过
register_shutdown_function
来捕获致命错误,在进程异常退出时做一些清理工作,具体参考 /wiki/page/305.html PHP
代码中如果有异常抛出,必须在回调函数中进行try/catch
捕获异常,否则会导致工作进程退出- 不支持
set_exception_handler
,必须使用try/catch
方式处理异常 Worker
进程不得共用同一个Redis
或MySQL
等网络服务客户端,Redis/MySQL
创建连接的相关代码可以放到onWorkerStart
回调函数中,具体参考 /wiki/page/325.html
- 异步程序要求代码中不得包含任何同步阻塞操作
- 异步与同步代码不能混用,一旦应用程序使用了任何同步阻塞的代码,程序即退化为同步模式
使用Coroutine
特性,请认真阅读 协程编程须知
请务必注意与同步阻塞
模式不同,异步
和协程
模式下程序是并发执行的,在同一时间内Server
会存在多个请求,因此应用程序必须为每个客户端或请求,创建不同的资源和上下文。否则不同的客户端和请求之间可能会产生数据和逻辑错乱。
新手非常容易犯这个错误,由于Swoole
是常驻内存的,所以加载类/函数定义的文件后不会释放。因此引入类/函数的php文件时必须要使用include_once
或require_once
,否则会发生cannot redeclare function/class
的致命错误。
PHP
守护进程与普通Web
程序的变量生命周期、内存管理方式完全不同。请参考 Server 内存管理 页面。编写Server
或其他常驻进程时需要特别注意。
Swoole\Server
程序的不同Worker
进程之间是隔离的,在编程时操作全局变量、定时器、事件监听,仅在当前进程内有效。请参考 进程隔离
Swoole
提供的Table
、Atomic
、Lock
组件是可以用于多进程编程的,但必须在Server->start
之前创建。另外Server
维持的TCP
客户端连接也可以跨进程操作,如Server->send
和Server->close
。